package org.jsping.service.impl;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jsping.dao.impl.MusicDaoImpl;
import org.jsping.dao.impl.SingerDaoImpl;
import org.jsping.entity.Music;
import org.jsping.entity.Singer;
import org.jsping.service.IMusicService;

/**
 * 音乐业务处理类
 * @author ping
 */
public class MusicServiceImpl implements IMusicService{
	
	private MusicDaoImpl musicDao = new MusicDaoImpl();
	private SingerDaoImpl singerDao = new SingerDaoImpl();
	
	/*根据歌曲的路径来拿到对应的具体音乐信息*/
	@Override
	public Music getMusicInfoByURl(String murl) {
		Music music = null;
		try {
			music = musicDao.getInfoByUrl(murl);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return music;
	}

	/*根据歌曲id来拿到对应的音乐信息*/
	@Override
	public Music getMusicInfo(int mid) {
		Music music = null;
		try {
			music = musicDao.getInfoByMid(mid);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return music;
	}

	/**
	 * 根据数量获取一部分音乐
	 */
	@Override
	public List<Music> getMusicList(int num) {
		//如果num小于1，那么就不要去查找数据
		if(num<1) {
			return null;
		}
		List<Music> list = null;
		try {
			list = musicDao.getMusic(num);
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return list;
	}
	
	//增加一首音乐
	//首先要在歌手表查询这个歌手在不在，获取歌手id
	//不存在就添加，存在就不添加,然后添加歌曲
	@Override
	public boolean addMusic(Music music) {
		//首先判断这个歌手存不存在
		Singer rs = null;
		try {
			rs = singerDao.selectSinger(music.getSname());
			//如果不存在那就添加,
			if(null==rs) {
				SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式  
				//添加歌手
				boolean res = false;
				res = singerDao.addSinger(new Singer(music.getSname(),df.format(new Date()),"/images/toux.jpg"));
				//如果添加歌手失败，那么停止添加歌曲
				if(!res) {
					return false;
				}
			}
			//获取歌手id
			int singerID = singerDao.selectSingerID(music.getSname());
			//根据歌曲名称，歌手id，获取这首歌！
			String murl = musicDao.selectMusic(music.getMname(),singerID);
			//这首存在，并且这首歌存在,但是歌曲连接不一样//那么更新这首歌曲的连接
			if(murl!=null && !music.getMurl().equals(murl)) {
				int num = updateMusic(music.getMid(), murl);  //调用更新的方法
				if(num>0) { 
					return true;
				}
			}
			int num =musicDao.addMusic(music,singerID);
			if(num>0) {
				System.out.println("添加成功!");
			}
		} catch (SQLException e1) {
			e1.printStackTrace();
			return false;
		}finally {
			singerDao.releaseAll();
			musicDao.releaseAll();
		}
		return true;
	}
	
	/**
	 * 随机获取一首歌曲
	 */
	public Music getRandomMusic() throws SQLException {
		 Music music = null;
		 try {
			 int count = musicDao.getCount(); //获取歌曲的总数量
			 int num = (int)Math.random()*count; //产生随机数
			 music = musicDao.getSpecialMusic(num); //获取到指定的歌曲
		 } catch (Exception e) {
			e.printStackTrace();
		 }finally {
			musicDao.releaseAll();
		 }
		 return music;
	}
	
	/**
	 * 返回对应数目的歌曲 ,key为对应的歌曲id value为对应的歌曲信息
	 */
	public Map<String, Music> randomMusic(int num) {
		Map<String, Music> musics = null;
		try {
			musics = musicDao.getMusics(num);
			System.out.println("获取到的歌曲数量:"+musics.size());
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return musics;
	}

	/**
	 * 更新歌曲信息
	 */
	@Override
	public int updateMusic(int mid, String murl) {
		int result = 0;
		try {
			result = musicDao.updateMusic(mid, murl);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 获取指定顺序的多少首歌
	 */
	@Override
	public Map<String, Music> getWannaMusics(int start, int num) {
		Map<String, Music> musics = null;
		try {
			//如数据库总共有50首
			//start代表开始的歌曲在数据库中的排行位置,num代表要获取的歌曲数量
			//现在要拿的歌是 36,10 代表从36开始的10首 则拿的是36-45这区间的10首
			//后面接下来要拿的是46，10 则要拿的是46-49 以及0-5这部分区间的歌
			//1.先判断 36 + 10 是否超过50 不超过则以start%50后剩下那部分作为起点,10为数量取10首
			//2.超过则判断 %50的值  如56,10  如果大于10 则用56%50为起点 再加10
			//3.如果%50的值 如 46,10 不超过10 则取剩下部分的几首 56%50 就是6首 剩下4首位46,(10-6);
			int count = musicDao.getCount();   //先拿到总的数量
			System.out.println("数据库中的歌曲总数量有:"+count);
			if(start+num <= count) {
				musics = musicDao.getOrderMusics(start, num);  //按顺序拿
			}else{
				int mol = (start+num)%count; //超出的部分
				if(mol>=num) {
					musics = musicDao.getOrderMusics(start%count, num); //多余部分大于要取的数量
				}else {
					musics = new HashMap<String, Music>();
					musics.putAll(musicDao.getOrderMusics(0, mol));    //超出的部分 比如6首
					musics.putAll(musicDao.getOrderMusics(start%count, num-mol)); //还要拿的部分
					System.out.println("此时的:"+(start%count)+",mod:"+mol+",还要拿的:"+(num-mol));
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return musics;
	}
	
	/*
	 * 根据一组mid,来返回对应的一组音乐集合
	 */
	public Map<String, Music> getMusics(List<Integer> mids){
		Map<String, Music> musics = null;
		try {
			if(mids!=null) {
				musics = new HashMap<String, Music>();
				for (int i = 0; i < mids.size(); i++) {
					Music music = musicDao.getInfoByMid(mids.get(i));  //根据id得到对应的音乐
					musics.put(String.valueOf(mids.get(i)), music);  //mid作为主键
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return musics;
	}
	
	/*根据mname和sid来得到对应的mid*/
	public int getMid(String mname,int sid) {
		int mid = 0;
		try {
			mid = musicDao.getMid(mname, sid);
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return mid;
	}
	
	/**
	 * 判断歌曲和对应的歌手是否存在
	 */
	public int isExists(String mname,String sname) {
		int num = 0;
		try {
			int sid = singerDao.selectSingerID(sname);
			if(sid>0) {
			   num = getMid(mname, sid);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			musicDao.releaseAll();
		}
		return num;
	}
}
